iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 13
1
AI & Data

一服見效的 AI 應用系列 第 13

Day 13:快速完成一個『對話機器人』(ChatBot) -- 續

  • 分享至 

  • xImage
  •  

前言

前一篇我們用了不到20行的程式,解析使用者說的話,程式了解語意後,要如何回應呢? 今天就來探討一下吧。

回應(Response)

回應的作法有很多種:

  1. 一問一答:假設公司有一個FAQ資料庫,裡面包含各式常見的問題及對應的解答,那就容易了,首先比對使用者的問題與FAQ資料庫所有的問題,找出相似度最高的問題,這部分可以使用TF-IDF演算法及Cosine Similarity 計算求得,之後再把對應的答案回應給使用者即可。舉一個簡單的範例說明TF-IDF、Cosine Similarity。
from sklearn.feature_extraction.text import CountVectorizer

#語料
corpus = [
    'This is the first document.',
    'This is the second second document.',
    'And the third one.',
    'Is this the first document?',
]
#將文件中的詞語轉換為詞頻矩陣
vectorizer = CountVectorizer()
#計算個詞語出現的次數
X = vectorizer.fit_transform(corpus)
#獲取詞袋中所有文件關鍵字
word = vectorizer.get_feature_names()
print ("word vocabulary=", word)
#查看詞頻結果
print ("BOW=", X.toarray())

from sklearn.feature_extraction.text import TfidfTransformer

#類調用
transformer = TfidfTransformer()
print ("transformer=", transformer)
#將詞頻矩陣X統計成TF-IDF值
tfidf = transformer.fit_transform(X)
#查看資料結構 tfidf[i][j]表示i類文件中的tf-idf權重
print ("tfidf=", tfidf.toarray())

# 最後一句與其他句的相似度
from sklearn.metrics.pairwise import cosine_similarity
print (cosine_similarity(tfidf[-1], tfidf, dense_output=False))
print (cosine_similarity(tfidf[-1], tfidf))
  1. 預約服務(Booking Service):如上一篇,依照服務類別(Skills),從輸入字句,找出使用者意圖(intent)及實體(Entity),然後依據人事時地物,查詢服務是否可以被滿足,再作出適當的回應。例如,飯店預約服務,使用者提出『下週五我要訂墾丁凱薩飯店雙人房兩晚』,系統就要作以下的轉換、查詢,再作出回應:
  • 『下週五』要轉換為日期(YYYY-MM-DD)。
  • 依據日期、地點、房型,查詢資料庫是否有空的房間。
  • 作出回應,如無空房,可能要提出建議,進一步接收使用者的輸入。
    這類的系統非常多,可以參考『Top 60 Chatbot Companies』,包含幾家領導廠商:
  • Google DialogFlow
  • Microsoft Bot Framework/LUIS/QnA Maker
  • IBM Watson Conversation Service
  • Facebook wit.ai

他們針對人事時地物的NER(Named-entity recognition)解析都有Library支援。

  1. 純聊天:像Siri這種App,一般企業應該不會提供這種沒有獲利機會的服務,這裡就不討論了。

ChatterBot

找個 open source Package 感受一下,ChatterBot 是一個自己設計問題及答案的套件,好像只能在Linux安裝,我在Windows下安裝失敗,就改在WSL(Windows Subsystem for Linux)安裝,還蠻順利的,指令如下:

pip install chatterbot

ChatterBot 是以知識圖(knowledge graph)儲存訓練及對話記錄,如下圖:
https://ithelp.ithome.com.tw/upload/images/20190928/200019768JeYOMGB75.png
圖. 兩段對話原始內容,圖形來源:https://chatterbot.readthedocs.io/en/stable/training.html

https://ithelp.ithome.com.tw/upload/images/20190928/20001976lBnrKVYPsm.png
圖. 兩段對話合併的結果,圖形來源:https://chatterbot.readthedocs.io/en/stable/training.html

舉兩個範例說明:

from chatterbot import ChatBot

# 產生一個 ChatBot,取名為 "Ron Obvious"
chatbot = ChatBot("Ron Obvious")

from chatterbot.trainers import ListTrainer

# 訓練資料
conversation = [
    "Hello",
    "Hi there!",
    "How are you doing?",
    "I'm doing great.",
    "That is good to hear",
    "Thank you.",
    "You're welcome."
]

# 訓練模型
trainer = ListTrainer(chatbot)
trainer.train(conversation)

# 測試
while True:
	str = input("your question:")
	if len(str) == 0: break
	response = chatbot.get_response(str)
	print(response)

對話中每個句子是前一個句子的回答,所以,輸入『Hello』,程式會回答『Hi there!』,輸入故意漏一兩個單字,發現效果並不太好,例如輸入『Thanks』,預期程式會回答『You're welcome.』,結果回答『Thank you.』,根據文件說明,系統會儲存對話內容,使系統愈來愈聰明。

另外系統業提供一些常見的邏輯連接器(logic adapters),例如,數學式的估算、目前時間的查詢,請看下面程式:

from chatterbot import ChatBot

# 產生一個 ChatBot,加入兩個邏輯連接器(logic adapters)
bot = ChatBot(
    'Math & Time Bot',
    logic_adapters=[
        'chatterbot.logic.MathematicalEvaluation',
        'chatterbot.logic.TimeLogicAdapter'
    ]
)

# 數學式估算
response = bot.get_response('What is 4 + 9?')
print(response)

# 目前時間查詢
response = bot.get_response('What time is it?')
print(response)

執行果如下圖:
https://ithelp.ithome.com.tw/upload/images/20190928/20001976kzLAe8n21K.png

結語

ChatBot 是一個物超所值的應用,技術門檻也不高,如果你的公司還沒有導入,那就趕快建議公司開始規劃吧!


上一篇
Day 12:快速完成一個『對話機器人』(ChatBot)
下一篇
Day 14:客服人力規劃(Workforce Planning) -- 線性規劃求解
系列文
一服見效的 AI 應用14
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言